package com.xxxtea.service;

import cn.hutool.core.util.StrUtil;
import com.xxxtea.common.UserContext;
import com.xxxtea.entity.*;
import com.xxxtea.mapper.DishMapper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 菜品服务类
 * 
 * 负责菜品相关的业务逻辑处理，包括：
 * - 菜品信息的查询和管理
 * - 为菜品设置额外的展示数据（如收藏状态）
 * - 异步记录浏览历史和搜索历史
 * 
 * @author badman
 * @since 1.0.0
 */
@Service
public class DishService extends BaseService<DishMapper, Dish> {
	
	/**
	 * 收藏服务，用于查询用户的收藏信息
	 */
	@Resource
	private CollectService collectService;
	
	/**
	 * 浏览历史服务，用于记录用户的浏览行为
	 */
	@Resource
	private BrowseHistoryService browseHistoryService;
	
	/**
	 * 搜索历史服务，用于记录用户的搜索行为
	 */
	@Resource
	private SearchHistoryService searchHistoryService;

	/**
	 * 为菜品列表设置额外的展示数据
	 * 
	 * 包括：
	 * - 设置菜品的收藏状态
	 * - 设置关联商家的收藏状态
	 * 
	 * @param dishList 菜品列表
	 */
	public void setExtraData(List<Dish> dishList) {
		// 查询当前用户收藏的菜品ID集合
		Set<Integer> dishIds = collectService.lambdaQuery().eq(Collect::getBusinessType, Collect.BusinessType.DISH).list()
				.stream().map(Collect::getBusinessId).collect(Collectors.toSet());
		
		// 查询当前用户收藏的商家ID集合
		Set<Integer> merchantIds = collectService.lambdaQuery().eq(Collect::getBusinessType, Collect.BusinessType.MERCHANT).list()
				.stream().map(Collect::getBusinessId).collect(Collectors.toSet());
		
		// 为每个菜品设置收藏状态
		for (Dish dish : dishList) {
			// 设置菜品的收藏状态
			dish.setCollect(dishIds.contains(dish.getId()));
			
			// 设置关联商家的收藏状态
			Merchant merchant = dish.getMerchant();
			if (merchant != null && merchantIds.contains(merchant.getId())) {
				merchant.setCollect(merchantIds.contains(merchant.getId()));
			}
		}
	}

	/**
	 * 异步保存浏览历史
	 * 
	 * 当用户浏览菜品时，异步记录浏览历史，不影响主业务流程
	 * 
	 * @param dishId 菜品ID
	 */
	@Async
	public void saveBrowseHistory(Integer dishId) {
		// 检查用户是否已登录
		if (UserContext.isLogin()) {
			// 创建浏览历史记录
			BrowseHistory browseHistory = new BrowseHistory();
			browseHistory.setDishId(dishId);
			// 保存浏览历史
			browseHistoryService.save(browseHistory);
		}
	}

	/**
	 * 异步保存搜索历史
	 * 
	 * 当用户搜索菜品时，异步记录搜索关键词，不影响主业务流程
	 * 
	 * @param param 搜索参数，包含搜索关键词
	 */
	@Async
	public void saveSearchHistory(Dish param) {
		// 检查搜索关键词是否不为空且用户已登录
		if (StrUtil.isNotBlank(param.getName()) && UserContext.isLogin()) {
			// 创建搜索历史记录
			SearchHistory searchHistory = new SearchHistory();
			searchHistory.setKeyword(param.getName());
			// 保存搜索历史
			searchHistoryService.save(searchHistory);
		}
	}
}
